﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Helena.Models;
using Helena.Areas.Productos.Models;
using Helena.Areas.Categorias.Models;
using Helena.Areas.Campanas.Models;
using Helena.Areas.Vendedores.Models;

namespace Helena.Areas.Degustaciones.Models
{
    public class LogicaDegustacion:InterfazLogicaDegustacion
    {
        DBContext Degustacion_contexto = new DBContext();
        DBGenericQueriesUtil<Degustacion> Tabla;
        DBGenericQueriesUtil<Producto> Tabla_producto;
        DBGenericQueriesUtil<Categoria> Tabla_categoria;
        DBGenericQueriesUtil<Campana> Tabla_campana;
        DBGenericQueriesUtil<Vendedor> Tabla_vendedor;
        DBGenericQueriesUtil<DetalleProducto> tabla_Detalle_Producto;

        #region Comun
        
        public DBContext context_publico { get { return Degustacion_contexto; } }

        public LogicaDegustacion() 
        {
            Tabla = new DBGenericQueriesUtil<Degustacion>(Degustacion_contexto,Degustacion_contexto.t_Degustacion);
            Tabla_producto = new DBGenericQueriesUtil<Producto>(Degustacion_contexto,Degustacion_contexto.t_Productos);
            Tabla_categoria = new DBGenericQueriesUtil<Categoria>(Degustacion_contexto,Degustacion_contexto.t_Categorias);
            Tabla_campana = new DBGenericQueriesUtil<Campana>(Degustacion_contexto,Degustacion_contexto.t_Campanas);
            Tabla_vendedor = new DBGenericQueriesUtil<Vendedor>(Degustacion_contexto, Degustacion_contexto.t_Vendedor);
            tabla_Detalle_Producto = new DBGenericQueriesUtil<DetalleProducto>(Degustacion_contexto, Degustacion_contexto.t_DetalleProductos);
        }

        public void i_AgregarDegustacion(DegustacionView degu)
        {
            Tabla.agregarElemento(degu.deserializa(this));

            //***********Suma a la tabla productos****************
            List<DetalleProducto> subproducto = tabla_Detalle_Producto.retornarTodos().Where(d => d.ProductoCID == degu.ProductoID).ToList();
            Producto producto = null;

            if (subproducto.Count == 0)
            {
                producto = Tabla_producto.retornarUnSoloElemento(degu.ProductoID);
                producto.cantidad = producto.cantidad - degu.Cantidad;
                Tabla_producto.modificarElemento(producto, producto.ID);
            }
            else
            {
                foreach (DetalleProducto dp in subproducto)
                {
                    producto = Tabla_producto.retornarUnSoloElemento(dp.ProductoID);
                    producto.cantidad = producto.cantidad - degu.Cantidad * dp.Cantidad;
                    Tabla_producto.modificarElemento(producto, producto.ID);
                }

                producto = Tabla_producto.retornarUnSoloElemento(degu.ProductoID);
                producto.cantidad = producto.cantidad - degu.Cantidad;
                Tabla_producto.modificarElemento(producto, producto.ID);
            }
            //*****************************************************
            //Producto p = Tabla_producto.retornarUnSoloElemento(degu.ProductoID);
            //p.cantidad = p.cantidad - degu.Cantidad;
            //Tabla_producto.modificarElemento(p, p.ID);
        }
        
        public void i_ModificarDegustacion(DegustacionView degu) 
        {
            Degustacion salida = new Degustacion();
            salida = Tabla.retornarUnSoloElemento(degu.ID);
            salida.Descripcion = degu.Descripcion;
            salida.Fecha = degu.Fecha;
            Tabla.modificarElemento(salida, salida.ID);
        }

        public void i_EliminarDegustacion(int id) 
        {
            Tabla.eliminarElemento_logico(id);
            Degustacion d = new Degustacion();
            d = Tabla.retornarUnSoloElemento(id);

            //***********Resta a la tabla productos****************
            List<DetalleProducto> subproducto = tabla_Detalle_Producto.retornarTodos().Where(r => r.ProductoCID == d.ProductoID).ToList();
            Producto producto = null;

            if (subproducto.Count == 0)
            {
                producto = Tabla_producto.retornarUnSoloElemento(d.ProductoID);
                producto.cantidad = producto.cantidad + d.Cantidad;
                Tabla_producto.modificarElemento(producto, producto.ID);
            }
            else
            {
                foreach (DetalleProducto dp in subproducto)
                {
                    producto = Tabla_producto.retornarUnSoloElemento(dp.ProductoID);
                    producto.cantidad = producto.cantidad + d.Cantidad * dp.Cantidad;
                    Tabla_producto.modificarElemento(producto, producto.ID);
                }

                producto = Tabla_producto.retornarUnSoloElemento(d.ProductoID);
                producto.cantidad = producto.cantidad + d.Cantidad;
                Tabla_producto.modificarElemento(producto, producto.ID);
            }
            //*****************************************************

        }

        public List<DegustacionView> i_RetornarDegustaciones() {
            List<Degustacion> s = Tabla.retornarTodos();
            List<DegustacionView> s_v = new List<DegustacionView>();

            foreach (Degustacion salida in s)
                    s_v.Add(new DegustacionView(salida));
            return s_v;
        }

        public DegustacionView i_RetornarDegustacion(int id) 
        {
            Degustacion d = Tabla.retornarUnSoloElemento(id);
            DegustacionView d_v = new DegustacionView(d);
            return d_v;
        }
        
        #endregion
    }
}
